import allure
import pytest


# TODO : 导入包- 导入对应的读取Excel的方法、关键字方法文件 【结合你自己的路径进行改动】
from extend.keywords import Keywords # 关键字文件
# from day08_2.apirun_frame.parse.YamlCaseParser import readYaml

# TODO 扩展-变量渲染： 【结合你自己的路径进行改动】
import copy
from core.globalContext import g_context  # 全局变量
from utils.VarRender import refresh  # 变量渲染

# TODO 扩展-多文件执行：
from parse.CaseParser import t_yaml_case_parser  # Yaml参数化调试方法
from utils.DynamicTitle import dynamicTitle  # 动态标题

class TestRunner:
    # TODO : 1 读取数据对应的数据
    # caseinfo = t_yaml_case_parser()

    # TODO : 2 进行参数化
    # @pytest.mark.parametrize("caseinfo", caseinfo["case_infos"])
    def test_case_execute(self, caseinfo):
        # allure 用例标题title，可按需拓展模块等...
        # allure.dynamic.title(caseinfo["desc"])
        # allure.dynamic.title(caseinfo["_case_name"])

        dynamicTitle(caseinfo)

        try:
            # TODO 扩展DDT- 获取单用例范围内的 变量数据
            local_context = caseinfo.get("context", {})
            context = copy.deepcopy(g_context().show_dict())
            context.update(local_context)

            # TODO 3: 实例化对象
            keywords = Keywords()
            # TODO 4: 获取对应的步骤，然后进行遍历
            steps = caseinfo.get("steps", None)
            for step in steps:
                # 提示信息
                step_name = list(step.keys())[0]
                step_value = list(step.values())[0]
                print(f"开始执行步骤：{step_name} - {step_value}")

                # # TODO 扩展-变量渲染
                context = copy.deepcopy(g_context().show_dict())
                # TODO 扩展DDT - 把当前用例也更新进去
                context.update(local_context)

                step_value = eval(refresh(step_value, context))  # 全局变量 +用例变量渲染

                with allure.step(step_name):
                    key = step_value["关键字"]
                    try:
                        # TODO 5: 通过反射的方法拿到对应的方法
                        key_func = keywords.__getattribute__(key)
                    except AttributeError as e:
                        print("没有这个关键字：", e)
                    key_func(**step_value)  # 调用关键字方法

        finally:
            print("---执行当前用例结束---")
